import Vue from "vue";
import App from "./App";
import directive from "./common/directive.js";
import utils from "./common/utils.js";
import config from "./config.js";
import onfire from "./common/onfire.js";
import share from "@/until/share.js";
Vue.mixin(share);
import { gotopage } from "@/common/gotopage.js";

/* Vuex */
import store from "./store/index.js";
Vue.prototype.$store = store;

// 公共组件
import headerBar from "./components/header.vue";
Vue.component("header-bar", headerBar);

//请求加载组件
import requestLoading from "./components/jjjloading.vue";

//组件挂载到全局，方便每个页面使用
Vue.component("request-loading", requestLoading);

/*底部数据*/
import tabBar from "@/components/tabbar/footTabbar.vue";
Vue.component("tabBar", tabBar);
Vue.prototype.footTabberData = {
  active: "home",
};

Vue.prototype.$fire = new onfire();

Vue.config.productionTip = false;

App.mpType = "app";

Vue.prototype.config = config;

const app = new Vue({
  ...App,
});
app.$mount();

Vue.prototype.websiteUrl = config.app_url;
Vue.prototype.app_id = config.app_id;
//h5发布路径
Vue.prototype.h5_addr = config.h5_addr;
/*页面跳转*/
Vue.prototype.gotoPage = gotopage;
Vue.prototype.font_url = config.font_url;

Vue.prototype.points_name = function (e) {
  if (!e) {
    return store.state.points_name;
  } else {
    let re = new RegExp("积分", "g");
    return e.replace(re, store.state.points_name);
  }
};

//#ifdef H5
app.$router.afterEach((to, from) => {
  const u = navigator.userAgent.toLowerCase();
  if (
    u.indexOf("like mac os x") < 0 ||
    u.match(/MicroMessenger/i) != "micromessenger"
  )
    return;
  if (to.path !== global.location.pathname) {
    location.assign(config.app_url + config.h5_addr + to.fullPath);
  }
});
//#endif

//是否是ios
Vue.prototype.ios = function () {
  const u = navigator.userAgent.toLowerCase();
  if (
    u.indexOf("like mac os x") < 0 ||
    u.match(/MicroMessenger/i) != "micromessenger"
  ) {
    return false;
  }
  return true;
};

//get请求
Vue.prototype._get = function (path, data, success, fail, complete) {
  data = data || {};
  data.token = uni.getStorageSync("token") || "";
  data.app_id = this.getAppId();
  let cityInfo = {};

  const cityInfoJson = uni.getStorageSync("cityInfo");
  if (cityInfoJson) {
    cityInfo = JSON.parse(cityInfoJson);
  }
  uni.request({
    url: this.websiteUrl + "/index.php/api/" + path,
    data: { ...data, ...cityInfo },
    dataType: "json",
    method: "GET",
    success: (res) => {
      if (res.statusCode !== 200 || typeof res.data !== "object") {
        return false;
      }
      if (res.data.code === -2) {
        this.showError(res.data.msg, function () {
          uni.removeStorageSync("token");
          this.gotoPage("/pages/index/index", "reLaunch");
        });
      } else if (res.data.code === -1) {
        // 登录态失效, 重新登录
        console.log("登录态失效, 重新登录");
        this.doLogin();
      } else if (res.data.code === 0) {
        this.showError(res.data.msg, function () {
          fail && fail(res);
        });
        return false;
      } else {
        success && success(res.data);
      }
    },
    fail: (res) => {
      fail && fail(res);
    },
    complete: (res) => {
      uni.hideLoading();
      complete && complete(res);
    },
  });
};

//get请求
Vue.prototype._post = function (path, data, success, fail, complete) {
  data = data || {};
  data.token = uni.getStorageSync("token") || "";
  data.app_id = this.getAppId();
  let cityInfo = {};

  const cityInfoJson = uni.getStorageSync("cityInfo");
  if (cityInfoJson) {
    cityInfo = JSON.parse(cityInfoJson);
  }
  uni.request({
    url: this.websiteUrl + "/index.php/api/" + path,
    data: { ...data, ...cityInfo },
    dataType: "json",
    method: "POST",
    header: {
      "content-type": "application/x-www-form-urlencoded",
    },
    success: (res) => {
      if (res.statusCode !== 200 || typeof res.data !== "object") {
        return false;
      }
      if (res.data.code === -1) {
        // 登录态失效, 重新登录
        console.log("登录态失效, 重新登录");
        this.doLogin();
      } else if (res.data.code === 0) {
        this.showError(res.data.msg, function () {
          fail && fail(res);
        });
        return false;
      } else {
        success && success(res.data);
      }
    },
    fail: (res) => {
      fail && fail(res);
    },
    complete: (res) => {
      uni.hideLoading();
      complete && complete(res);
    },
  });
};

Vue.prototype.doLogin = function () {
  let pages = getCurrentPages();
  if (pages.length) {
    let currentPage = pages[pages.length - 1];
    if (
      "pages/login/login" != currentPage.route &&
      "pages/login/weblogin" != currentPage.route &&
      "pages/login/openlogin" != currentPage.route
    ) {
      uni.setStorageSync("currentPage", currentPage.route);
      uni.setStorageSync("currentPageOptions", currentPage.options);
    }
  }
  console.log("app_ID=" + this.getAppId());
  //公众号
  // #ifdef  H5
  console.log(this);
  if (this.isWeixin()) {
    window.location.href =
      this.websiteUrl +
      "/index.php/api/user.usermp/login?app_id=" +
      this.getAppId() +
      "&referee_id=" +
      uni.getStorageSync("referee_id");
  } else {
    this.gotoPage("/pages/login/weblogin");
  }
  // #endif
  // #ifdef APP-PLUS
  this.gotoPage("/pages/login/openlogin", "redirect");
  return;
  // #endif
  // 非公众号,跳转授权页面
  // #ifndef  H5
  this.gotoPage("/pages/login/login");
  // #endif
};

/**
 * 显示失败提示框
 */
Vue.prototype.showError = function (msg, callback) {
  uni.showModal({
    title: "友情提示",
    content: msg,
    showCancel: false,
    success: function (res) {
      callback && callback();
    },
  });
};

/**
 * 显示失败提示框
 */
Vue.prototype.showSuccess = function (msg, callback) {
  uni.showModal({
    title: "友情提示",
    content: msg,
    showCancel: false,
    success: function (res) {
      callback && callback();
    },
  });
};

/**
 * 获取应用ID
 */
Vue.prototype.getAppId = function () {
  return this.app_id || 10001;
};

Vue.prototype.compareVersion = function (v1, v2) {
  v1 = v1.split(".");
  v2 = v2.split(".");
  const len = Math.max(v1.length, v2.length);

  while (v1.length < len) {
    v1.push("0");
  }
  while (v2.length < len) {
    v2.push("0");
  }

  for (let i = 0; i < len; i++) {
    const num1 = parseInt(v1[i]);
    const num2 = parseInt(v2[i]);

    if (num1 > num2) {
      return 1;
    } else if (num1 < num2) {
      return -1;
    }
  }

  return 0;
};

/**
 * 生成转发的url参数
 */
Vue.prototype.getShareUrlParams = function (params) {
  let self = this;
  return utils.urlEncode(
    Object.assign(
      {
        referee_id: self.getUserId(),
        app_id: self.getAppId(),
      },
      params
    )
  );
};

/**
 * 当前用户id
 */
Vue.prototype.getUserId = function () {
  return uni.getStorageSync("user_id");
};

//#ifdef H5
var jweixin = require("jweixin-module");

Vue.prototype.configWx = function (signPackage, shareParams, params) {
  if (signPackage == "") {
    return;
  }
  let self = this;
  jweixin.config(JSON.parse(signPackage));

  let url_params = self.getShareUrlParams(params);

  jweixin.ready(function (res) {
    jweixin.updateAppMessageShareData({
      title: shareParams.title,
      desc: shareParams.desc,
      link:
        self.websiteUrl + self.h5_addr + shareParams.link + "?" + url_params,
      imgUrl: shareParams.imgUrl,
      success: function () {},
    });
    jweixin.updateTimelineShareData({
      title: shareParams.title,
      desc: shareParams.desc,
      link:
        self.websiteUrl + self.h5_addr + shareParams.link + "?" + url_params,
      imgUrl: shareParams.imgUrl,
      success: function () {},
    });
  });
};

Vue.prototype.configWxScan = function (signPackage) {
  if (signPackage == "") {
    return;
  }
  jweixin.config(JSON.parse(signPackage));
  return jweixin;
};
//#endif

/**
 * 获取当前平台
 */
Vue.prototype.getPlatform = function (params) {
  let platform = "wx";
  // #ifdef  APP-PLUS
  if (uni.getSystemInfoSync().platform == "android") {
    platform = "android";
  } else {
    platform = "ios";
  }
  // #endif
  // #ifdef  H5
  if (this.isWeixin()) {
    platform = "mp";
  } else {
    platform = "h5";
  }
  // #endif
  return platform;
};

/**
 * 订阅通知,目前仅小程序
 */
Vue.prototype.subMessage = function (temlIds, callback) {
  let self = this;
  // #ifdef  MP-WEIXIN
  //小程序订阅消息
  const version = wx.getSystemInfoSync().SDKVersion;
  if (
    temlIds &&
    temlIds.length != 0 &&
    self.compareVersion(version, "2.8.2") >= 0
  ) {
    wx.requestSubscribeMessage({
      tmplIds: temlIds,
      success(res) {},
      fail(res) {},
      complete(res) {
        callback();
      },
    });
  } else {
    callback();
  }
  // #endif
  // #ifndef MP-WEIXIN
  callback();
  // #endif
};

Vue.prototype.isWeixin = function () {
  var ua = navigator.userAgent.toLowerCase();
  if (ua.match(/MicroMessenger/i) == "micromessenger") {
    return true;
  } else {
    return false;
  }
};

/**
 * 获取访客
 */
Vue.prototype.getVisitcode = function () {
  let visitcode = uni.getStorageSync("visitcode");
  if (!visitcode) {
    visitcode = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(
      /[xy]/g,
      function (c) {
        var r = (Math.random() * 16) | 0,
          v = c == "x" ? r : (r & 0x3) | 0x8;
        return v.toString(16);
      }
    );
    visitcode = visitcode.replace(/-/g, "");
    uni.setStorageSync("visitcode", visitcode);
  }

  return visitcode;
};

Vue.prototype.topBarTop = function () {
  // #ifdef MP-WEIXIN
  return uni.getMenuButtonBoundingClientRect().top;
  // #endif
  // #ifndef MP-WEIXIN
  const SystemInfo = uni.getSystemInfoSync();
  return SystemInfo.statusBarHeight;
  // #endif
};
Vue.prototype.topBarHeight = function () {
  // #ifdef MP-WEIXIN
  return uni.getMenuButtonBoundingClientRect().height;
  // #endif
  // #ifndef MP-WEIXIN
  return 0;
  // #endif
};
Vue.prototype.yulan = function (e, i) {
  let image_path_arr = [];
  if (!Array.isArray(e)) {
    image_path_arr = [e];
  } else {
    if (e[0].file_path) {
      e.forEach((item, index) => {
        image_path_arr.push(item.file_path);
      });
    } else {
      image_path_arr = e;
    }
  }
  let picnum = i * 1;
  uni.previewImage({
    urls: image_path_arr,
    current: picnum,
    indicator: "default",
  });
};
Vue.prototype.theme = function () {
  return "theme" + this.$store.state.theme || "";
};
Vue.prototype.footTab = function () {
  return this.$store.state.footTab || "";
};
/* 小数点截取 */
Vue.prototype.subPrice = function (str, val) {
  let strs = String(str);
  if (val == 1) {
    return strs.substring(0, strs.indexOf("."));
  } else if (val == 2) {
    let indof = strs.indexOf(".");
    return strs.slice(indof + 1, indof + 3);
  }
};
/*转两位数*/
Vue.prototype.convertTwo = function (n) {
  let str = "";
  if (n < 10) {
    str = "0" + n;
  } else {
    str = n;
  }
  return str;
};
Vue.prototype.getTabBarLinks = function () {
  let vars = uni.getStorageSync("TabBar");
  let theme = uni.getStorageSync("theme");
  if (vars != null && vars != "") {
    this.setTabBarLinks(vars, theme);
  } else {
    uni.request({
      url: this.config.app_url + "/index.php/api/index/nav",
      data: {
        app_id: this.config.app_id,
      },
      success: (result) => {
        let vars = result.data.data.vars.data;
        let theme = result.data.data.theme.theme;
        this.$store.commit("changeTheme", theme);
        uni.setStorageSync("TabBar", vars);
        uni.setStorageSync("theme", theme);
        this.setTabBarLinks(vars, theme);
      },
    });
  }
};
Vue.prototype.setTabBarLinks = function (vars, theme) {
  if (vars.is_auto == "0") {
    uni.showTabBar();
    vars.list = [];
    let color = [
      "#ff5704",
      "#19ad57",
      "#ffcc00",
      "#1774ff",
      "#e4e4e4",
      "#c8ba97",
      "#623ceb",
    ];
    uni.setTabBarStyle({
      color: "#333333",
      selectedColor: color[theme],
    });
    uni.setTabBarItem({
      index: 0,
      text: "首页",
      iconPath: "static/tabbar/home.png",
      selectedIconPath: "static/tabbar/home_" + theme + ".png",
    });
    uni.setTabBarItem({
      index: 1,
      text: "分类",
      iconPath: "static/tabbar/category.png",
      selectedIconPath: "static/tabbar/category_" + theme + ".png",
    });
    uni.setTabBarItem({
      index: 2,
      text: "店铺",
      iconPath: "static/tabbar/shop.png",
      selectedIconPath: "static/tabbar/shop_" + theme + ".png",
    });
    uni.setTabBarItem({
      index: 3,
      text: "购物车",
      iconPath: "static/tabbar/cart.png",
      selectedIconPath: "static/tabbar/cart_" + theme + ".png",
    });
    uni.setTabBarItem({
      index: 4,
      text: "我的",
      iconPath: "static/tabbar/user.png",
      selectedIconPath: "static/tabbar/user_" + theme + ".png",
    });
  } else {
    uni.hideTabBar();
  }
};
Vue.prototype.getThemeColor = function () {
  let theme = this.$store.state.theme;
  let color = [
    "#ff5704",
    "#19ad57",
    "#ffcc00",
    "#1774ff",
    "#e4e4e4",
    "#c8ba97",
    "#623ceb",
  ];
  return color[theme];
};
